1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.base;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20
21 import com.google.common.annotations.GwtCompatible;
22
23 import java.io.Serializable;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Collection;
27 import java.util.List;
28
29 import javax.annotation.Nullable;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 @GwtCompatible(emulated = true)
45 public final class Predicates {
46 private Predicates() {}
47
48
49
50
51
52
53
54 @GwtCompatible(serializable = true)
55 public static <T> Predicate<T> alwaysTrue() {
56 return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
57 }
58
59
60
61
62 @GwtCompatible(serializable = true)
63 public static <T> Predicate<T> alwaysFalse() {
64 return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
65 }
66
67
68
69
70
71 @GwtCompatible(serializable = true)
72 public static <T> Predicate<T> isNull() {
73 return ObjectPredicate.IS_NULL.withNarrowedType();
74 }
75
76
77
78
79
80 @GwtCompatible(serializable = true)
81 public static <T> Predicate<T> notNull() {
82 return ObjectPredicate.NOT_NULL.withNarrowedType();
83 }
84
85
86
87
88
89 public static <T> Predicate<T> not(Predicate<T> predicate) {
90 return new NotPredicate<T>(predicate);
91 }
92
93
94
95
96
97
98
99
100
101
102 public static <T> Predicate<T> and(
103 Iterable<? extends Predicate<? super T>> components) {
104 return new AndPredicate<T>(defensiveCopy(components));
105 }
106
107
108
109
110
111
112
113
114
115
116 public static <T> Predicate<T> and(Predicate<? super T>... components) {
117 return new AndPredicate<T>(defensiveCopy(components));
118 }
119
120
121
122
123
124
125
126 public static <T> Predicate<T> and(Predicate<? super T> first,
127 Predicate<? super T> second) {
128 return new AndPredicate<T>(Predicates.<T>asList(
129 checkNotNull(first), checkNotNull(second)));
130 }
131
132
133
134
135
136
137
138
139
140
141 public static <T> Predicate<T> or(
142 Iterable<? extends Predicate<? super T>> components) {
143 return new OrPredicate<T>(defensiveCopy(components));
144 }
145
146
147
148
149
150
151
152
153
154
155 public static <T> Predicate<T> or(Predicate<? super T>... components) {
156 return new OrPredicate<T>(defensiveCopy(components));
157 }
158
159
160
161
162
163
164
165 public static <T> Predicate<T> or(
166 Predicate<? super T> first, Predicate<? super T> second) {
167 return new OrPredicate<T>(Predicates.<T>asList(
168 checkNotNull(first), checkNotNull(second)));
169 }
170
171
172
173
174
175 public static <T> Predicate<T> equalTo(@Nullable T target) {
176 return (target == null)
177 ? Predicates.<T>isNull()
178 : new IsEqualToPredicate<T>(target);
179 }
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 public static <T> Predicate<T> in(Collection<? extends T> target) {
195 return new InPredicate<T>(target);
196 }
197
198
199
200
201
202
203
204 public static <A, B> Predicate<A> compose(
205 Predicate<B> predicate, Function<A, ? extends B> function) {
206 return new CompositionPredicate<A, B>(predicate, function);
207 }
208
209
210
211
212 enum ObjectPredicate implements Predicate<Object> {
213
214 ALWAYS_TRUE {
215 @Override public boolean apply(@Nullable Object o) {
216 return true;
217 }
218 @Override public String toString() {
219 return "Predicates.alwaysTrue()";
220 }
221 },
222
223 ALWAYS_FALSE {
224 @Override public boolean apply(@Nullable Object o) {
225 return false;
226 }
227 @Override public String toString() {
228 return "Predicates.alwaysFalse()";
229 }
230 },
231
232 IS_NULL {
233 @Override public boolean apply(@Nullable Object o) {
234 return o == null;
235 }
236 @Override public String toString() {
237 return "Predicates.isNull()";
238 }
239 },
240
241 NOT_NULL {
242 @Override public boolean apply(@Nullable Object o) {
243 return o != null;
244 }
245 @Override public String toString() {
246 return "Predicates.notNull()";
247 }
248 };
249
250 @SuppressWarnings("unchecked")
251 <T> Predicate<T> withNarrowedType() {
252 return (Predicate<T>) this;
253 }
254 }
255
256
257 private static class NotPredicate<T> implements Predicate<T>, Serializable {
258 final Predicate<T> predicate;
259
260 NotPredicate(Predicate<T> predicate) {
261 this.predicate = checkNotNull(predicate);
262 }
263 @Override
264 public boolean apply(@Nullable T t) {
265 return !predicate.apply(t);
266 }
267 @Override public int hashCode() {
268 return ~predicate.hashCode();
269 }
270 @Override public boolean equals(@Nullable Object obj) {
271 if (obj instanceof NotPredicate) {
272 NotPredicate<?> that = (NotPredicate<?>) obj;
273 return predicate.equals(that.predicate);
274 }
275 return false;
276 }
277 @Override public String toString() {
278 return "Predicates.not(" + predicate.toString() + ")";
279 }
280 private static final long serialVersionUID = 0;
281 }
282
283 private static final Joiner COMMA_JOINER = Joiner.on(',');
284
285
286 private static class AndPredicate<T> implements Predicate<T>, Serializable {
287 private final List<? extends Predicate<? super T>> components;
288
289 private AndPredicate(List<? extends Predicate<? super T>> components) {
290 this.components = components;
291 }
292 @Override
293 public boolean apply(@Nullable T t) {
294
295 for (int i = 0; i < components.size(); i++) {
296 if (!components.get(i).apply(t)) {
297 return false;
298 }
299 }
300 return true;
301 }
302 @Override public int hashCode() {
303
304 return components.hashCode() + 0x12472c2c;
305 }
306 @Override public boolean equals(@Nullable Object obj) {
307 if (obj instanceof AndPredicate) {
308 AndPredicate<?> that = (AndPredicate<?>) obj;
309 return components.equals(that.components);
310 }
311 return false;
312 }
313 @Override public String toString() {
314 return "Predicates.and(" + COMMA_JOINER.join(components) + ")";
315 }
316 private static final long serialVersionUID = 0;
317 }
318
319
320 private static class OrPredicate<T> implements Predicate<T>, Serializable {
321 private final List<? extends Predicate<? super T>> components;
322
323 private OrPredicate(List<? extends Predicate<? super T>> components) {
324 this.components = components;
325 }
326 @Override
327 public boolean apply(@Nullable T t) {
328
329 for (int i = 0; i < components.size(); i++) {
330 if (components.get(i).apply(t)) {
331 return true;
332 }
333 }
334 return false;
335 }
336 @Override public int hashCode() {
337
338 return components.hashCode() + 0x053c91cf;
339 }
340 @Override public boolean equals(@Nullable Object obj) {
341 if (obj instanceof OrPredicate) {
342 OrPredicate<?> that = (OrPredicate<?>) obj;
343 return components.equals(that.components);
344 }
345 return false;
346 }
347 @Override public String toString() {
348 return "Predicates.or(" + COMMA_JOINER.join(components) + ")";
349 }
350 private static final long serialVersionUID = 0;
351 }
352
353
354 private static class IsEqualToPredicate<T>
355 implements Predicate<T>, Serializable {
356 private final T target;
357
358 private IsEqualToPredicate(T target) {
359 this.target = target;
360 }
361 @Override
362 public boolean apply(T t) {
363 return target.equals(t);
364 }
365 @Override public int hashCode() {
366 return target.hashCode();
367 }
368 @Override public boolean equals(@Nullable Object obj) {
369 if (obj instanceof IsEqualToPredicate) {
370 IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
371 return target.equals(that.target);
372 }
373 return false;
374 }
375 @Override public String toString() {
376 return "Predicates.equalTo(" + target + ")";
377 }
378 private static final long serialVersionUID = 0;
379 }
380
381
382 private static class InPredicate<T> implements Predicate<T>, Serializable {
383 private final Collection<?> target;
384
385 private InPredicate(Collection<?> target) {
386 this.target = checkNotNull(target);
387 }
388
389 @Override
390 public boolean apply(@Nullable T t) {
391 try {
392 return target.contains(t);
393 } catch (NullPointerException e) {
394 return false;
395 } catch (ClassCastException e) {
396 return false;
397 }
398 }
399
400 @Override public boolean equals(@Nullable Object obj) {
401 if (obj instanceof InPredicate) {
402 InPredicate<?> that = (InPredicate<?>) obj;
403 return target.equals(that.target);
404 }
405 return false;
406 }
407
408 @Override public int hashCode() {
409 return target.hashCode();
410 }
411
412 @Override public String toString() {
413 return "Predicates.in(" + target + ")";
414 }
415 private static final long serialVersionUID = 0;
416 }
417
418
419 private static class CompositionPredicate<A, B>
420 implements Predicate<A>, Serializable {
421 final Predicate<B> p;
422 final Function<A, ? extends B> f;
423
424 private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
425 this.p = checkNotNull(p);
426 this.f = checkNotNull(f);
427 }
428
429 @Override
430 public boolean apply(@Nullable A a) {
431 return p.apply(f.apply(a));
432 }
433
434 @Override public boolean equals(@Nullable Object obj) {
435 if (obj instanceof CompositionPredicate) {
436 CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
437 return f.equals(that.f) && p.equals(that.p);
438 }
439 return false;
440 }
441
442 @Override public int hashCode() {
443 return f.hashCode() ^ p.hashCode();
444 }
445
446 @Override public String toString() {
447 return p.toString() + "(" + f.toString() + ")";
448 }
449
450 private static final long serialVersionUID = 0;
451 }
452
453 private static <T> List<Predicate<? super T>> asList(
454 Predicate<? super T> first, Predicate<? super T> second) {
455
456 return Arrays.<Predicate<? super T>>asList(first, second);
457 }
458
459 private static <T> List<T> defensiveCopy(T... array) {
460 return defensiveCopy(Arrays.asList(array));
461 }
462
463 static <T> List<T> defensiveCopy(Iterable<T> iterable) {
464 ArrayList<T> list = new ArrayList<T>();
465 for (T element : iterable) {
466 list.add(checkNotNull(element));
467 }
468 return list;
469 }
470 }
471